/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAOs;

import DAOs.exceptions.IllegalOrphanException;
import DAOs.exceptions.NonexistentEntityException;
import DAOs.exceptions.PreexistingEntityException;
import VO.Usuarios;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import VO.Datoscliente;
import VO.Tiposusuarios;
import VO.Empresas;
import java.util.ArrayList;
import java.util.Collection;
import VO.Contactos;

/**
 *
 * @author Julian
 */
public class UsuariosJpaController {

    public UsuariosJpaController() {
        
    }
    

    public void create(Usuarios usuarios,EntityManager em1) throws PreexistingEntityException, Exception {
        if (usuarios.getEmpresasCollection() == null) {
            usuarios.setEmpresasCollection(new ArrayList<Empresas>());
        }
        if (usuarios.getContactosCollection() == null) {
            usuarios.setContactosCollection(new ArrayList<Contactos>());
        }
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Datoscliente datoscliente = usuarios.getDatoscliente();
            if (datoscliente != null) {
                datoscliente = em.getReference(datoscliente.getClass(), datoscliente.getIdUsuario());
                usuarios.setDatoscliente(datoscliente);
            }
            Tiposusuarios idTipo = usuarios.getIdTipo();
            if (idTipo != null) {
                idTipo = em.getReference(idTipo.getClass(), idTipo.getIdtiposUsuarios());
                usuarios.setIdTipo(idTipo);
            }
            Collection<Empresas> attachedEmpresasCollection = new ArrayList<Empresas>();
            for (Empresas empresasCollectionEmpresasToAttach : usuarios.getEmpresasCollection()) {
                empresasCollectionEmpresasToAttach = em.getReference(empresasCollectionEmpresasToAttach.getClass(), empresasCollectionEmpresasToAttach.getIdEmpresas());
                attachedEmpresasCollection.add(empresasCollectionEmpresasToAttach);
            }
            usuarios.setEmpresasCollection(attachedEmpresasCollection);
            Collection<Contactos> attachedContactosCollection = new ArrayList<Contactos>();
            for (Contactos contactosCollectionContactosToAttach : usuarios.getContactosCollection()) {
                contactosCollectionContactosToAttach = em.getReference(contactosCollectionContactosToAttach.getClass(), contactosCollectionContactosToAttach.getContactosPK());
                attachedContactosCollection.add(contactosCollectionContactosToAttach);
            }
            usuarios.setContactosCollection(attachedContactosCollection);
            em.persist(usuarios);
            if (datoscliente != null) {
                Usuarios oldUsuariosOfDatoscliente = datoscliente.getUsuarios();
                if (oldUsuariosOfDatoscliente != null) {
                    oldUsuariosOfDatoscliente.setDatoscliente(null);
                    oldUsuariosOfDatoscliente = em.merge(oldUsuariosOfDatoscliente);
                }
                datoscliente.setUsuarios(usuarios);
                datoscliente = em.merge(datoscliente);
            }
            if (idTipo != null) {
                idTipo.getUsuariosCollection().add(usuarios);
                idTipo = em.merge(idTipo);
            }
            for (Empresas empresasCollectionEmpresas : usuarios.getEmpresasCollection()) {
                Usuarios oldIdUsuarioOfEmpresasCollectionEmpresas = empresasCollectionEmpresas.getIdUsuario();
                empresasCollectionEmpresas.setIdUsuario(usuarios);
                empresasCollectionEmpresas = em.merge(empresasCollectionEmpresas);
                if (oldIdUsuarioOfEmpresasCollectionEmpresas != null) {
                    oldIdUsuarioOfEmpresasCollectionEmpresas.getEmpresasCollection().remove(empresasCollectionEmpresas);
                    oldIdUsuarioOfEmpresasCollectionEmpresas = em.merge(oldIdUsuarioOfEmpresasCollectionEmpresas);
                }
            }
            for (Contactos contactosCollectionContactos : usuarios.getContactosCollection()) {
                Usuarios oldUsuariosOfContactosCollectionContactos = contactosCollectionContactos.getUsuarios();
                contactosCollectionContactos.setUsuarios(usuarios);
                contactosCollectionContactos = em.merge(contactosCollectionContactos);
                if (oldUsuariosOfContactosCollectionContactos != null) {
                    oldUsuariosOfContactosCollectionContactos.getContactosCollection().remove(contactosCollectionContactos);
                    oldUsuariosOfContactosCollectionContactos = em.merge(oldUsuariosOfContactosCollectionContactos);
                }
            }
            //em.getTransaction().commit();
        } catch (Exception ex) {
            if (findUsuarios(usuarios.getIdUsuarios(),em) != null) {
                throw new PreexistingEntityException("Usuarios " + usuarios + " already exists.", ex);
            }
            throw ex;
        } 
    }

    public void edit(Usuarios usuarios,EntityManager em1) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            //em = getEntityManager();
            em.getTransaction().begin();
            Usuarios persistentUsuarios = em.find(Usuarios.class, usuarios.getIdUsuarios());
            Datoscliente datosclienteOld = persistentUsuarios.getDatoscliente();
            Datoscliente datosclienteNew = usuarios.getDatoscliente();
            Tiposusuarios idTipoOld = persistentUsuarios.getIdTipo();
            Tiposusuarios idTipoNew = usuarios.getIdTipo();
            Collection<Empresas> empresasCollectionOld = persistentUsuarios.getEmpresasCollection();
            Collection<Empresas> empresasCollectionNew = usuarios.getEmpresasCollection();
            Collection<Contactos> contactosCollectionOld = persistentUsuarios.getContactosCollection();
            Collection<Contactos> contactosCollectionNew = usuarios.getContactosCollection();
            List<String> illegalOrphanMessages = null;
            if (datosclienteOld != null && !datosclienteOld.equals(datosclienteNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Datoscliente " + datosclienteOld + " since its usuarios field is not nullable.");
            }
            for (Empresas empresasCollectionOldEmpresas : empresasCollectionOld) {
                if (!empresasCollectionNew.contains(empresasCollectionOldEmpresas)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Empresas " + empresasCollectionOldEmpresas + " since its idUsuario field is not nullable.");
                }
            }
            for (Contactos contactosCollectionOldContactos : contactosCollectionOld) {
                if (!contactosCollectionNew.contains(contactosCollectionOldContactos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Contactos " + contactosCollectionOldContactos + " since its usuarios field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (datosclienteNew != null) {
                datosclienteNew = em.getReference(datosclienteNew.getClass(), datosclienteNew.getIdUsuario());
                usuarios.setDatoscliente(datosclienteNew);
            }
            if (idTipoNew != null) {
                idTipoNew = em.getReference(idTipoNew.getClass(), idTipoNew.getIdtiposUsuarios());
                usuarios.setIdTipo(idTipoNew);
            }
            Collection<Empresas> attachedEmpresasCollectionNew = new ArrayList<Empresas>();
            for (Empresas empresasCollectionNewEmpresasToAttach : empresasCollectionNew) {
                empresasCollectionNewEmpresasToAttach = em.getReference(empresasCollectionNewEmpresasToAttach.getClass(), empresasCollectionNewEmpresasToAttach.getIdEmpresas());
                attachedEmpresasCollectionNew.add(empresasCollectionNewEmpresasToAttach);
            }
            empresasCollectionNew = attachedEmpresasCollectionNew;
            usuarios.setEmpresasCollection(empresasCollectionNew);
            Collection<Contactos> attachedContactosCollectionNew = new ArrayList<Contactos>();
            for (Contactos contactosCollectionNewContactosToAttach : contactosCollectionNew) {
                contactosCollectionNewContactosToAttach = em.getReference(contactosCollectionNewContactosToAttach.getClass(), contactosCollectionNewContactosToAttach.getContactosPK());
                attachedContactosCollectionNew.add(contactosCollectionNewContactosToAttach);
            }
            contactosCollectionNew = attachedContactosCollectionNew;
            usuarios.setContactosCollection(contactosCollectionNew);
            usuarios = em.merge(usuarios);
            if (datosclienteNew != null && !datosclienteNew.equals(datosclienteOld)) {
                Usuarios oldUsuariosOfDatoscliente = datosclienteNew.getUsuarios();
                if (oldUsuariosOfDatoscliente != null) {
                    oldUsuariosOfDatoscliente.setDatoscliente(null);
                    oldUsuariosOfDatoscliente = em.merge(oldUsuariosOfDatoscliente);
                }
                datosclienteNew.setUsuarios(usuarios);
                datosclienteNew = em.merge(datosclienteNew);
            }
            if (idTipoOld != null && !idTipoOld.equals(idTipoNew)) {
                idTipoOld.getUsuariosCollection().remove(usuarios);
                idTipoOld = em.merge(idTipoOld);
            }
            if (idTipoNew != null && !idTipoNew.equals(idTipoOld)) {
                idTipoNew.getUsuariosCollection().add(usuarios);
                idTipoNew = em.merge(idTipoNew);
            }
            for (Empresas empresasCollectionNewEmpresas : empresasCollectionNew) {
                if (!empresasCollectionOld.contains(empresasCollectionNewEmpresas)) {
                    Usuarios oldIdUsuarioOfEmpresasCollectionNewEmpresas = empresasCollectionNewEmpresas.getIdUsuario();
                    empresasCollectionNewEmpresas.setIdUsuario(usuarios);
                    empresasCollectionNewEmpresas = em.merge(empresasCollectionNewEmpresas);
                    if (oldIdUsuarioOfEmpresasCollectionNewEmpresas != null && !oldIdUsuarioOfEmpresasCollectionNewEmpresas.equals(usuarios)) {
                        oldIdUsuarioOfEmpresasCollectionNewEmpresas.getEmpresasCollection().remove(empresasCollectionNewEmpresas);
                        oldIdUsuarioOfEmpresasCollectionNewEmpresas = em.merge(oldIdUsuarioOfEmpresasCollectionNewEmpresas);
                    }
                }
            }
            for (Contactos contactosCollectionNewContactos : contactosCollectionNew) {
                if (!contactosCollectionOld.contains(contactosCollectionNewContactos)) {
                    Usuarios oldUsuariosOfContactosCollectionNewContactos = contactosCollectionNewContactos.getUsuarios();
                    contactosCollectionNewContactos.setUsuarios(usuarios);
                    contactosCollectionNewContactos = em.merge(contactosCollectionNewContactos);
                    if (oldUsuariosOfContactosCollectionNewContactos != null && !oldUsuariosOfContactosCollectionNewContactos.equals(usuarios)) {
                        oldUsuariosOfContactosCollectionNewContactos.getContactosCollection().remove(contactosCollectionNewContactos);
                        oldUsuariosOfContactosCollectionNewContactos = em.merge(oldUsuariosOfContactosCollectionNewContactos);
                    }
                }
            }
            //em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = usuarios.getIdUsuarios();
                if (findUsuarios(id,em) == null) {
                    throw new NonexistentEntityException("The usuarios with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } 
    }

    public void destroy(String id,EntityManager em1) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = em1;
            //em.getTransaction().begin();
            Usuarios usuarios;
            try {
                usuarios = em.getReference(Usuarios.class, id);
                usuarios.getIdUsuarios();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The usuarios with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Datoscliente datosclienteOrphanCheck = usuarios.getDatoscliente();
            if (datosclienteOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuarios (" + usuarios + ") cannot be destroyed since the Datoscliente " + datosclienteOrphanCheck + " in its datoscliente field has a non-nullable usuarios field.");
            }
            Collection<Empresas> empresasCollectionOrphanCheck = usuarios.getEmpresasCollection();
            for (Empresas empresasCollectionOrphanCheckEmpresas : empresasCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuarios (" + usuarios + ") cannot be destroyed since the Empresas " + empresasCollectionOrphanCheckEmpresas + " in its empresasCollection field has a non-nullable idUsuario field.");
            }
            Collection<Contactos> contactosCollectionOrphanCheck = usuarios.getContactosCollection();
            for (Contactos contactosCollectionOrphanCheckContactos : contactosCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuarios (" + usuarios + ") cannot be destroyed since the Contactos " + contactosCollectionOrphanCheckContactos + " in its contactosCollection field has a non-nullable usuarios field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Tiposusuarios idTipo = usuarios.getIdTipo();
            if (idTipo != null) {
                idTipo.getUsuariosCollection().remove(usuarios);
                idTipo = em.merge(idTipo);
            }
            em.remove(usuarios);
            //em.getTransaction().commit();
        } catch(Exception ex){
            throw ex;
        }
    }

    public List<Usuarios> findUsuariosEntities(EntityManager em1) throws Exception {
        return findUsuariosEntities(true, -1, -1,em1);
    }

    public List<Usuarios> findUsuariosEntities(int maxResults, int firstResult,EntityManager em1) throws Exception {
        return findUsuariosEntities(false, maxResults, firstResult,em1);
    }

    private List<Usuarios> findUsuariosEntities(boolean all, int maxResults, int firstResult,EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            Query q = em.createQuery("select object(o) from Usuarios as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } catch(Exception ex){
            throw ex;
        }
    }

    public Usuarios findUsuarios(String id,EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            return em.find(Usuarios.class, id);
        } catch(Exception ex){
            throw ex;
        }
    }

    public int getUsuariosCount(EntityManager em1) throws Exception {
        EntityManager em = em1;
        try {
            Query q = em.createQuery("select count(o) from Usuarios as o");
            return ((Long) q.getSingleResult()).intValue();
        } catch(Exception ex){
            throw ex;
        }
    }

}
